from PIL import Image
import struct

def rgb_to_rgb565(r, g, b):
    """将 RGB 值转换为 RGB565 格式"""
    r = (r >> 3) & 0x1F  # 5 bits for red
    g = (g >> 2) & 0x3F  # 6 bits for green
    b = (b >> 3) & 0x1F  # 5 bits for blue
    return (r << 11) | (g << 5) | b

def bmp_to_rgb565_binary(bmp_file, output_file):
    """将 BMP 文件转换为 RGB565 数组并保存为二进制文件"""
    img = Image.open(bmp_file)
    img = img.convert('RGB')  # 确保图像为 RGB 模式
    width, height = img.size

    if width > 1280:
        print("错误：宽不能超过1280")
        sys.exit()

    if height > 720:
        print("错误：高不能超过720")
        sys.exit()

    if width * height > 118780:
        print("错误：宽x高不能超过118780")
        sys.exit()

    with open(output_file, 'wb') as f:
        f.write("LOGO".encode('utf-8'))
        f.write(struct.pack('<H', width))
        f.write(struct.pack('<H', height))
        for y in range(height):
            for x in range(width):
                r, g, b = img.getpixel((x, y))
                rgb565_value = rgb_to_rgb565(r, g, b)
                # 使用 struct.pack 将整数转换为二进制格式（小端序）
                f.write(struct.pack('<H', rgb565_value))  # '<H' 表示小端序的无符号短整型

# 示例用法
bmp_file_path = 'logo.bmp'  # 替换为你的 BMP 文件路径
output_binary_file_path = 'logo.bin'  # 输出的二进制文件路径

bmp_to_rgb565_binary(bmp_file_path, output_binary_file_path)

print(f"转换完成，RGB565 数据已保存到 {output_binary_file_path}")